package com.itheima.proxy.cglib_proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @Author 王加鑫
 * @Date 2021/08/06 22:35
 * @Since JDK 1.8
 * JDK实现动态代理需要实现类通过接口定义业务方法，对于没有接口的类，如何实现动态代理呢，这就需要CGLib了
 *
 * CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少，但是CGLib在创建代理对象时所花费的时间却比JDK多得多，
 * 所以对于单例的对象，因为无需频繁创建对象，用CGLib合适，反之，使用JDK方式要更为合适一些。
 * 同时，由于CGLib由于是采用动态创建子类的方法，对于final方法，无法进行代理
 */
public class CglibProxy implements MethodInterceptor {
    //创建Enhancer对象（可以理解为内存中动态创建了一个类的字节码）
    private Enhancer enhancer = new Enhancer();
    //创建代理对象
    public Object getProxy(Class clazz){
        //设置需要创建子类的类
        enhancer.setSuperclass(clazz);
        //设置回调方法
        enhancer.setCallback(this);
        //通过字节码技术动态创建子类实例
        return enhancer.create();
    }

    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object ret = null;
        if(method.getName().equals("chuZu")){
            System.out.println("中介帮助房东出租房子");
            try {
                ret = methodProxy.invokeSuper(o,objects);
            } catch (Throwable throwable) {
                throwable.printStackTrace();
                throwable.getMessage();
            }
            System.out.println("中介收取中介费");
        }
        return ret;
    }
}
